CO2-uitstoot van auto’s in de Europese Unie: Tussen afname en de noodzaak tot verdere reductie#

Student namen: Laiba Shamsul, Popke Snoek, Yoshi Fu, Pepeyn Velthuijse

Team nummer: G4

Introductie#

De toenemende CO2-uitstoot door auto’s vormt een dringende uitdaging op het gebied van milieu en klimaatverandering. Wereldwijd heeft de transportsector een aanzienlijk aandeel in de totale uitstoot van broeikasgassen, waarbij auto’s een substantieel deel voor hun rekening nemen. Om een duidelijker beeld te krijgen van welke automerken of modellen hogere of lagere uitstoot hebben, en om mensen in staat te stellen milieubewustere beslissingen te nemen, gaan we in deze data story dieper in op de monitoring van de CO2-uitstoot van personenauto’s in de Europese Unie.

Onze data story maakt gebruik van datasets uit de jaren 2015 tot en met 2021. Deze datasets bevatten uitgebreide informatie over de CO2-uitstoot van auto’s. We hebben ervoor gekozen om het jaar 2015 als startpunt te nemen voor onze analyse, omdat dit het jaar was waarin het klimaatakkoord van Parijs werd ondertekend. In artikel 4.4 van dit internationale akkoord wordt namelijk aangegeven dat alle deelnemende landen zich verbinden aan het bereiken van een zogenaamde ‘gedeelde inspanning’ om de uitstoot van broeikasgassen aanzienlijk te verminderen. Door middel van dit artikel zouden we de data dus kunnen analyseren en uitzoeken of het akkoord inderdaad heeft gezorgd voor een vermindering.

Verder zullen we in deze data story de data vanuit twee tegenstellende perspectieven interpreteren. Aan de ene kant hebben we het perspectief dat CO2-emissies in het wegverkeer van 2015 tot en met 2021 zijn afgenomen, waardoor het geen significant probleem meer vormt. Daarentegen hebben we het perspectief dat de CO2-emissies niet zijn afgenomen in de afgelopen jaren, waardoor het noodzakelijk is om deze te verminderen.

Om deze perspectieven te onderzoeken en te onderbouwen, zullen we gebruikmaken van visuele representaties. Onder andere zullen grafieken en diagrammen ons helpen om patronen, trends en verschillen in emissieniveaus te ontdekken. Deze visuele presentaties stellen ons in staat om in één oogopslag te illustreren welke veranderingen in emissies tussen 2015 en 2021 hebben plaatsgevonden.

Door gebruik te maken van de beschikbare gegevens en deze te visualiseren, streven we ernaar om een helder beeld te bieden van de CO2-uitstoot van auto’s.

Hide code cell content
# Import packages
from plotly.subplots import make_subplots
import plotly.express as px
import plotly.graph_objects as go
import pandas as pd
import numpy as np
Hide code cell content
# Retrieve csv files for visualisations
country_emission = pd.read_csv("country_emission.csv")
ft_mean_emission = pd.read_csv("ft_mean_emission.csv")
car_emission_mass = pd.read_csv("car_emission_mass.csv")

total_emission = pd.read_csv("total_emission.csv")
df_counts = pd.read_csv("fuel_type_distribution.csv")
total_emission_per_ft = pd.read_csv("total_emission_per_ft.csv")

car_emission = pd.read_csv("car_emission.csv")

Dataset and preprocessing#

Voor onze data story hebben wij gebruik gemaakt van de CO2 Cars Emission Datasets van het Europees Mileauagentschap (EEA). Dit zijn 7 datasets die de jaren 2015-2021 vertegenwoordigen en deze bevatten gegevens over de CO2-uitstoot van personenauto’s in Europa. In de datasets is informatie te vinden over de uitstoot van meerdere Europese landen en over diverse overige aspecten, waaronder het merk en het model van de auto, het jaar van registratie, het brandstoftype, de CO2-uitstoot in gram per kilometer en andere technische specificaties.

Om onze dataset voor te bereiden op verdere analyse, hebben we een reeks preprocessing-stappen toegepast. Ons doel was om de data schoon te maken, te filteren en te transformeren, zodat het geschikt zou zijn voor onze specifieke behoeften. Ten eerste hebben we de zeven afzonderlijke datasets samengevoegd. Door deze datasets samen te voegen, konden we een meer omvattend beeld krijgen van de CO2-uitstoot van personenauto’s over een periode van zeven jaar waardoor het later makkelijker zou zijn om de visualisaties te creëren. Daarna hebben we onze dataset gefilterd op basis van de kolommen die we nodig hadden voor onze visualisaties en ook de rijen met ontbrekende waarden helemaal verwijderd. Om ervoor te zorgen dat de brandstoftypen consistent waren, hebben we een transformatie toegepast. We hebben de slashes in de brandstoftypen bijvoorbeeld vervangen door streepjes en alle tekst naar kleine letters geconverteerd. Bovendien hebben we een nieuwe kolom toegevoegd aan de dataset, namelijk het jaartal. De originele datasets bevatten deze kolom natuurlijk niet aangezien ze gericht zijn op jaarlijkse uitstoot, maar omdat wij deze datasets hebben samengevoegd was het relevant om het toe te voegen. Vervolgens hebben we alle kolomnamen hernoemd omdat de zeven datasets verschillende namen gebruikten voor dezelfde kolommen. In de ene dataset werd de kolom bijvoorbeeld ‘Country’ genoemd, terwijl in een andere dataset ‘Member state’ werd gebruikt. Ten slotte hebben we de rijen met ‘Hydrogen’ als brandstoftype uitgefilterd.

Door deze preprocessing-stappen toe te passen, hebben we een schone, gefilterde en getransformeerde dataset verkregen, die klaar was voor verdere analyse.

Hide code cell source
# Plot settings
rows = 2
cols = 1
fig = make_subplots(rows=rows, cols=cols, x_title="Landcode", y_title="CO2 emissie in WLTP (g/km)")

for year in [2015, 2016, 2017, 2018, 2019, 2020, 2021]:
    # Find index of 'IE' to split the countries on ('IE' is often in the middle).
    country_emission_year = country_emission[country_emission["year"]==year].reset_index()
    split_index = country_emission_year[country_emission_year["Country"]=="IE"].index
    country_emission_split = np.split(country_emission[country_emission["year"]==year], split_index)

    # Subplot settings
    showlegend = True
    for row in range(rows):
        for col in range(cols):
            index = cols * row + col
            fig.append_trace(
                go.Bar(
                    x=country_emission_split[index]["Country"],
                    y=country_emission_split[index]["Ewltp (g/km) mean"],
                    name=year,
                    marker=dict(color=px.colors.qualitative.Plotly[year-2015]),
                    showlegend=showlegend,
                ),
                row=row + 1,
                col=col + 1,
            )
            showlegend = False

fig.update_layout(
    title_text="CO2-uitstoot door personenauto's per land in de EU tussen 2015 en 2021",
    legend_title="Jaar",
)
fig.show()

Figuur 1. In dit staafdiagram, waarbij de x-as de “Country” (land) voorstelt en de y-as de “CO2 emission WLTP (g/km)” (CO2-uitstoot WLTP in g/km), wordt de gemiddelde CO2-uitstoot van personenauto’s in verschillende landen van de Europese Unie over de periode 2018-2021 getoond. Elke staaf vertegenwoordigt een land en de hoogte geeft de uitstoot weer. De error bars tonen de standaarddeviatie hiervan aan.

Figuur 1 kan het eerste perspectief vertegenwoordigen, waarbij we beweerden dat de emissies in het wegverkeer zijn afgenomen waardoor CO2-uitstoot geen groot probleem meer is. De visualisatie toont namelijk aan dat de CO2-uitstoot sinds 2018 in alle landen aanzienlijk is gedaald, wat het bewijs levert voor het eerste perspectief. Het tweede perspectief, waarbij we stellen dat de uitstoot niet is gedaald, is dus niet van toepassing omdat dit wel het geval is geweest.

Hoewel de cijfers hebben aangetoond dat er positieve veranderingen zijn opgetreden, betekent dit niet dat het probleem van de CO2-uitstoot meteen is opgelost. De absolute hoeveelheid uitstoot kan namelijk nog steeds significant zijn en bijdragen aan klimaatverandering. Daarnaast is het van belang om te evalueren of de daling in CO2-uitstoot in het wegverkeer duurzaam en langdurig is. Uit figuur 1 blijkt bijvoorbeeld dat er een daling is geweest ten opzichte van 2018, maar daarna is er geen verdere daling waargenomen.

Hide code cell source
# Plot settings
rows = 2
cols = 1
fig = make_subplots(rows=rows, cols=cols, x_title="Landcode", y_title="CO2 emissie reductie in WLTP (g/km)")

for year in [2015, 2016, 2017, 2018, 2019, 2020, 2021]:
    # Find index of 'IE' to split the countries on ('IE' is often in the middle).
    country_emission_year = country_emission[country_emission["year"]==year].reset_index()
    split_index = country_emission_year[country_emission_year["Country"]=="IE"].index
    country_emission_split = np.split(country_emission[country_emission["year"]==year], split_index)

    # Subplot settings
    for row in range(rows):
        for col in range(cols):
            index = cols * row + col
            showlegend = row == col == 0
            fig.append_trace(
                go.Bar(
                    x=country_emission_split[index]["Country"],
                    y=country_emission_split[index]["Erwltp (g/km) mean"],
                    name=year,
                    marker=dict(color=px.colors.qualitative.Plotly[year-2015]),
                    showlegend=showlegend,
                ),
                row=row + 1,
                col=col + 1,
            )

fig.update_layout(
    title_text="Gemiddelde CO2-uitstoot vermindering vanwege innovatieve technologieën per land in de EU tussen 2015 en 2021",
    legend_title="Jaar",
)
fig.show()

Figuur 3. Deze taartdiagram visualiseert de gemiddelde CO2-uitstoot per brandstoftype in het jaar 2021. Elk segment in het diagram vertegenwoordigt een brandstoftype, zoals benzine, diesel, elektrisch, enz. De grootte van elk segment weerspiegelt het aandeel van de CO2-uitstoot dat wordt bijgedragen door dat specifieke brandstoftype. Door middel van deze taartdiagram kunnen wij de CO2-uitstoot tussen verschillende brandstoftypes vergelijke en de brandstoftypes met de hoogste en laagste uitstoot identificeren.

Hide code cell source
# Plot settings
fig = px.bar(total_emission_per_ft,
    x="Ft",
    y="Ewltp (g/km)",
    title="Totale CO2-uitstoot van personenauto's in de EU per brandstof type (2021)",
    custom_data=[total_emission_per_ft["n"]],
    labels={
        "Ewltp (g/km)": "CO2 emissie in WLTP (g/km)",
        "Ft": "Brandstof type",
    }
)
fig.update_traces(hovertemplate="CO2 emissie in WLTP (g/km)=%{y}<br>Aantal auto's=%{customdata[0]}")
fig.show()

Figuur 4. Deze staafdiagram visualiseert de totale CO2-uitstoot van personenauto’s in de Europese Unie, ingedeeld naar brandstoftype. De x-as vertegenwoordigt de verschillende brandstoftypes, terwijl de y-as de CO2-uitstoot in WLTP (g/km) weergeeft. Elke staaf geeft de emissiewaarden weer voor een specifiek brandstoftype. Door deze visualisatie te lezen, kunnen lezers gemakkelijk de brandstoftypes identificeren die de hoogste en laagste CO2-uitstoot hebben, waardoor inzicht ontstaat in de impact van verschillende brandstoffen op de uitstoot van broeikasgassen in de transportsector.

Om ons perspectief verder te versterken, kunnen we naar verschillende figuren kijken die de CO2-uitstoot van verschillende brandstoftypes voor auto’s illustreren. Figuur 3 toont aan dat elektrische voertuigen een CO2-uitstoot van 0% hebben, terwijl figuur 4 laat zien dat auto’s die op benzine rijden aanzienlijke hoeveelheden CO2 uitstoten. In de EU bedroeg de totale CO2-uitstoot van personenauto’s voor het brandstoftype ‘petrol’ namelijk 735.0874 miljoen gram per kilometer in één jaar. Dit is heel hoog vergeleken met het maximale toegestane hoeveelheid uitstoot van 95 g/km. Deze twee figuren creëren een correlatie die het belang van het verminderen van CO2-uitstoot benadrukt. Het laat namelijk zien dat elektrische voertuigen het potentieel hebben om een aanzienlijk impact te hebben op het verminderen van de broeikasgasemissies die bijdragen aan klimaatverandering als ze de traditionele brandstoffen worden vervangen.

Hide code cell source
# Definieer kleuren voor de brandstof types
colormap = {
    "Elektrisch": 'blue',
    "Semi-Elektrisch": 'purple',
    "Anders": 'grey',
}

# Plot settings
fig = px.bar(df_counts,
    x="year",
    y="percent",
    color="Ft",
    title="Brandstof type distributie van personenauto's in de EU tussen 2015 en 2021",
    labels={
        "percent": "Percentage van alle personenauto's",
        "year": 'Jaar',
        "Ft": 'Brandstof type',
    },
    hover_data=['counts'],
    color_discrete_map=colormap  # Gebruik de kleurenkaart
)
fig.show()

Figuur 5. Dit staafdiagram laat de verdeling zien van verschillende brandstoftypes voor personenauto’s in de Europese Unie gedurende de periode 2015-2021. De x-as geeft de jaren weer, terwijl de y-as het percentage van alle personenauto’s vertegenwoordigt. Elke staaf vertegenwoordigt een specifiek brandstoftype, aangegeven met de legenda. Door dit diagram te lezen, krijgen lezers inzicht in de verschuivingen in de populariteit van verschillende brandstoftypes over de jaren heen.

We hebben net beredeneerd dat de CO2-emissies niet zijn afgenomen omdat er geen afname is op te merken in de uitstoot vanwege innovatieve technologieën. Daarnaast is de uitstoot ook erg hoog vanwege benzine. Het is echter ook belangrijk om te overwegen of er al dan niet gewerkt wordt aan het ontwikkelen en implementeren van elektrische auto’s om ervoor te zorgen dat ze de traditionele brandstoffen vervangen.

Uit de visualisatie van figuur 5 blijkt bijvoorbeeld dat slechts 2.01% van de geregistreerde auto’s in de EU in 2018 elektrisch was. Dit percentage is in het volgende jaar gestegen met 16.93%.

Hide code cell source
df_split = np.array_split(car_emission, 8)

plot1 = px.scatter(df_split[0], x='year', y='Enedc (g/km) mean', color='Mk')
plot2 = px.scatter(df_split[1], x='year', y='Enedc (g/km) mean', color='Mk')
plot3 = px.scatter(df_split[2], x='year', y='Enedc (g/km) mean', color='Mk')
plot4 = px.scatter(df_split[3], x='year', y='Enedc (g/km) mean', color='Mk')
plot5 = px.scatter(df_split[4], x='year', y='Enedc (g/km) mean', color='Mk')
plot6 = px.scatter(df_split[5], x='year', y='Enedc (g/km) mean', color='Mk')
plot7 = px.scatter(df_split[6], x='year', y='Enedc (g/km) mean', color='Mk')
plot8 = px.scatter(df_split[7], x='year', y='Enedc (g/km) mean', color='Mk')



#print(plot1['data'][0],plot1['data'][1],plot1['data'][2], end='\n')

fig = make_subplots(rows=3, cols=3, specs=[[{"type": "scatter"}, {"type": "scatter"}, {"type": "scatter"}],
                                           [{"type": "scatter"}, {"type": "scatter"}, {"type": "scatter"}],
                                           [{"type": "scatter"}, {"type": "scatter"}, {"type": "scatter"}]])

fig.append_trace(plot1['data'][0], row=1, col=1)
fig.append_trace(plot1['data'][1], row=1, col=1)
fig.append_trace(plot1['data'][2], row=1, col=1)

fig.append_trace(plot2['data'][0], row=1, col=2)
fig.append_trace(plot2['data'][1], row=1, col=2)
fig.append_trace(plot2['data'][2], row=1, col=2)

fig.append_trace(plot3['data'][0], row=1, col=3)
fig.append_trace(plot3['data'][1], row=1, col=3)
fig.append_trace(plot3['data'][2], row=1, col=3)

fig.append_trace(plot4['data'][0], row=2, col=1)
fig.append_trace(plot4['data'][1], row=2, col=1)
fig.append_trace(plot4['data'][2], row=2, col=1)

fig.append_trace(plot5['data'][0], row=2, col=2)
fig.append_trace(plot5['data'][1], row=2, col=2)
fig.append_trace(plot5['data'][2], row=2, col=2)

fig.append_trace(plot6['data'][0], row=2, col=3)
fig.append_trace(plot6['data'][1], row=2, col=3)
fig.append_trace(plot6['data'][2], row=2, col=3)

fig.append_trace(plot7['data'][0], row=3, col=1)
fig.append_trace(plot7['data'][1], row=3, col=1)
fig.append_trace(plot7['data'][2], row=3, col=1)

fig.append_trace(plot8['data'][0], row=3, col=2)
fig.append_trace(plot8['data'][1], row=3, col=2)
fig.append_trace(plot8['data'][2], row=3, col=2)

fig.update_layout(showlegend=True, height=1000, width=1000)
fig.show()
Hide code cell source
fig = make_subplots(specs=[[{"secondary_y": True}]])

years = [2015, 2016, 2017, 2018, 2019, 2020, 2021]
eu_emission = country_emission.groupby("year").sum()

fig.add_trace(
    go.Scatter(x=years, y=eu_emission["Ewltp (g/km) mean"], name="Gemiddelde"),
    secondary_y=False,
)

fig.add_trace(
    go.Scatter(x=years, y=eu_emission["Ewltp (g/km) sum"], name="Totaal"),
    secondary_y=True,
)

fig.update_layout(
    title_text="Gemiddelde en totale CO2 emissie door personenauto's in de EU tussen 2015 en 2021",
    xaxis_title="Jaar",
)

fig.update_yaxes(title_text="Gemiddelde CO2 emissie in WLTP (g/km)", secondary_y=False)
fig.update_yaxes(title_text="Totale CO2 emissie in WLTP (g/km)", secondary_y=True)

fig.show()
Hide code cell source
# Plot settings
fig = px.scatter(car_emission_mass,
	x="m (kg)",
	y="Ewltp (g/km)",
	color="Ft",
)

# Create toggle visibility button for every fuel type.
buttons = []
for i, val in enumerate(car_emission_mass["Ft"].unique()):
    button = dict(method='restyle',
        label=val,
        args=[{'visible': True}, [i]],
        args2=[{'visible': "legendonly"}, [i]],
    )
    buttons.append(button)

# Menu settings
fig.update_layout(
    updatemenus=[
        dict(
            buttons=buttons,
            visible=False,
        ),
    ],
    annotations=[
        dict(text="Toggle traces by clicking the legend", x=0, xref="paper", y=1.05, yref="paper", align="right", showarrow=False),
    ],
    title_text="CO2 emissie van personenauto's in de EU verdeeld bij massa (2021)",
    legend_title="Brandstof type",
    xaxis_title="Massa (kg)",
    xaxis_range=(0, 3500),
    yaxis_title="CO2 emissie in WLTP (g/km)",
    yaxis_range=(0, 550),
)
fig.show()

Reflectie#

Werk Distributie#

References#

Originele dataset: https://www.eea.europa.eu/data-and-maps/data/co2-cars-emission-22

GitHub repository: FuYoshi/data_story_project

Verwerkte dataset: https://www.kaggle.com/datasets/yoshifu/co2-emission-from-cars-2015-2021